﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Runtime.Serialization;

namespace TOTTO.FINGERPRINT.SERVICIOS
{
    public class clMarcacionVer
    {
        private byte[] vcData;
        private List<string> vcCads;
        private string vcDataStr = string.Empty;
        private int vcDv;
        
        public List<string> vCads { get { return vcCads; } }
        public int vDv { get { return vcDv; } }
        public byte[] vData { get { return vcData; } }

        public clMarcacionVer(string paPri, string paSeg, string paTer, string paCua)
        {
            string vRes = string.Empty;

            vcCads = new List<string>();

            vcCads.Add(paPri);
            vcCads.Add(paSeg);
            vcCads.Add(paTer);
            vcCads.Add(paCua);

            mCodifica();
        }

        public clMarcacionVer(int paDv, byte[] paData)
        {
            vcData = paData;
            vcDv = paDv;
            vcCads = new List<string>();

            mDecodifica();
        }

        private void mDecodifica()
        {
            string vvTextoFinal = string.Empty;
            List<string> vvColumnas = new List<string>();
            string vvTextoInicial = string.Empty;
            string vvTextoXColumna = string.Empty;
            short vvFilMax = 4;
            short vvColMax = 0;
            short vvFilMin = 4;
            short vvColMin = 0;
            short vvPosFil = 4;
            short vvPosCol = 0;
            bool vvReversa = vcDv > 10 ? false : true;

            vvTextoFinal = Encoding.UTF8.GetString(vcData);
            int vvCol = vvTextoFinal.Length / 5;

            vcDataStr = vvTextoFinal;

            for (int y = 0; y <= vvTextoFinal.Length - 5; y += 5)
            {
                vvTextoXColumna = vvTextoFinal.Substring(y, 5);

                vvColumnas.Add(vvReversa ? String.Join("", vvTextoXColumna.Reverse()) : vvTextoXColumna);

                vvReversa = !vvReversa;
            }

            char[,] vvMat = new char[5, vvColumnas.Count];

            foreach (string g in vvColumnas)
            {
                vvPosFil = 0;

                foreach (char c in g.ToCharArray())
                {
                    vvMat[vvPosFil, vvPosCol] = c;

                    vvPosFil++;
                }

                vvPosCol++;
            }

            vvPosFil = 4;
            vvPosCol = 0;

            for (int f = 0; f < vvTextoFinal.Length && f < (((vcDv > 9 ? vvCol - 1 : vvCol) * 5) + (vcDv > 9 ? vcDv - 10 : vcDv)); f++)
            {
                vvTextoInicial += vvMat[vvPosFil, vvPosCol];

                vvPosCol++;
                vvPosFil++;

                if (vvPosFil > vvFilMax && vvPosCol > vvColMax)
                {
                    vvColMax++;

                    if (vvColMax < 5)
                    {
                        vvFilMin--;
                    }
                    else
                    {
                        if (vvColMax > vvCol - 1)
                        {
                            vvColMax--;
                            vvFilMax--;

                            if (vvFilMax < 0)
                            {
                                break;
                            }
                        }

                        vvColMin++;
                    }

                    vvPosFil = vvFilMin;
                    vvPosCol = vvColMin;
                }
            }

            vcCads.AddRange(vvTextoInicial.Split('|').AsEnumerable());
        }

        private void mCodifica()
        {
            string vvTextoInicial = String.Join("|", vcCads);
            int vvLen = vvTextoInicial.Length;
            vcDv = vvLen % 5;
            int vvCol = vvLen / 5;
            short vvFilMax = 4;
            short vvColMax = 0;
            short vvFilMin = 4;
            short vvColMin = 0;
            short vvPosFil = 4;
            short vvPosCol = 0;
            string vvTextoXColumna = string.Empty;
            string vvTextoFinal = string.Empty;

            if (vcDv > 0)
            {
                vvCol++;
            }

            //Se debe crear aqui porque necesita el recalculo de las columnas.
            char[,] vvMat = new char[5, vvCol];

            while (vvTextoInicial.Length < vvCol * 5)
                vvTextoInicial += "|" + vvTextoInicial;

            vvTextoInicial = vvTextoInicial.Substring(0, (vvCol * 5));

            vvLen = vvTextoInicial.Length;

            foreach (char t in vvTextoInicial)
            {
                vvMat[vvPosFil, vvPosCol] = t;

                vvPosCol++;
                vvPosFil++;

                if (vvPosFil > vvFilMax && vvPosCol > vvColMax)
                {
                    vvColMax++;

                    if (vvColMax < 5)
                    {
                        vvFilMin--;
                    }
                    else
                    {
                        if (vvColMax > vvCol - 1)
                        {
                            vvColMax--;
                            vvFilMax--;

                            if (vvFilMax < 0)
                            {
                                break;
                            }
                        }

                        vvColMin++;
                    }

                    vvPosFil = vvFilMin;
                    vvPosCol = vvColMin;
                }
            }

            if (String.Join("|", vcCads).Length % 2 == 0 && vcDv != 0)
                vcDv += 10;

            bool vvReversa = vcDv > 10 ? false : true;

            for (short s = 0; s < vvCol; s++)
            {
                vvTextoXColumna = string.Empty;

                for (short t = 0; t < 5; t++)
                {
                    vvTextoXColumna += vvMat[t, s];
                }

                vvTextoFinal += vvReversa ? String.Join("",vvTextoXColumna.Reverse()) : vvTextoXColumna;

                vvReversa = !vvReversa;
            }

            vcDataStr = vvTextoFinal;

            vcData = Encoding.UTF8.GetBytes(vvTextoFinal);
        }


    }
}
